/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package uloha3;

import java.util.Arrays;
import java.util.List;

/**
 *
 * @author varga
 */
public class VyriesHrubouSilou implements BatohAlgoritmus {

    List<Batoh> zoznamInstancii;

    VyriesHrubouSilou(List<Batoh> zoznamInstancii) {
       this.zoznamInstancii = zoznamInstancii;
    }

    
    String vyriesProblemAvypisRiesenie(Batoh b) { //prechadza vsetky ohodnotenia konfiguracnych premennych

        int citac = 0;
        int dosavadnaMaxCena = 0;
        String citacBinarny;
        int[] poleKonfiguracie=  new int[b.pocetVeciVbatohu];
        int[] konfiguraciaSmaxHodnotou = new int[b.pocetVeciVbatohu];

        int[] tempPole = new int[b.pocetVeciVbatohu];

        for (int kombinaciaVeci = 0; kombinaciaVeci < Math.pow(2, b.pocetVeciVbatohu); kombinaciaVeci++, citac++) { // pre 4 veci 16* prebehne cytklus

            citacBinarny = Integer.toBinaryString(citac);

            Arrays.fill(poleKonfiguracie, 0);
            int pocitadlo = 0;
            for (int i = b.pocetVeciVbatohu - citacBinarny.length(); i < b.pocetVeciVbatohu; i++, pocitadlo++) {
                tempPole[i] = (Integer.valueOf(citacBinarny.charAt(pocitadlo))) - 48;
            }//dopn nevyznamove nuly

            for (int i = 0; i < tempPole.length; i++) {
                poleKonfiguracie[i] = tempPole[i];// pole konfiguracie je aktualna binarna konfiguracia

            }//pole konfig obsahuje citac v binare

            boolean jeLepsieMax = skontrolujPodmienku(poleKonfiguracie, b);

            if (jeLepsieMax) {
                int sumaCeny = 0;
                for (int i = 0; i < poleKonfiguracie.length; i++) {
                    sumaCeny += poleKonfiguracie[i] * (b.zoznamVeci.get(i)).cenaVeci;
                }


                if (sumaCeny > dosavadnaMaxCena) {
                    dosavadnaMaxCena = sumaCeny;
                    for (int i = 0; i < poleKonfiguracie.length; i++) {
                        konfiguraciaSmaxHodnotou[i] = poleKonfiguracie[i];
                    }
                }
            }
        }
        StringBuilder riesenie = new StringBuilder();
        riesenie.append(b.cisloInstancie + " " + b.pocetVeciVbatohu + " " + dosavadnaMaxCena + " ");
        for (int i = 0; i < konfiguraciaSmaxHodnotou.length; i++) {
            riesenie.append(konfiguraciaSmaxHodnotou[i] + " ");
        }
        riesenie.append("\n");
        System.out.print(riesenie);
        return riesenie.toString();
    }

    public boolean skontrolujPodmienku(int[] konfiguracia, Batoh b) {
        double sumaHmotnosti = 0;
        for (int i = 0; i < konfiguracia.length; i++) {
            sumaHmotnosti += konfiguracia[i] * (b.zoznamVeci.get(i)).hmotnostVeci;
        }
        if (sumaHmotnosti <= b.maxHmotnost) {
            return true;
        } 
        return false;
    }

    public String vyriesProblemBatohu() {
        StringBuilder riesenieTotal = new StringBuilder();
        for (Batoh aktualnaInstancia: zoznamInstancii)
        {
            riesenieTotal.append(vyriesProblemAvypisRiesenie(aktualnaInstancia));
        }
        riesenieTotal.append("\n");
        return riesenieTotal.toString();
    }
}
